package d2_final_exam.d1_first_question;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

/**
 * 1)    定义订单类Order，创建ArrayList集合，用于存储订单Order对象
 * 2）   请使用Stream流找出今天之前的订单，并遍历输出。
 * 3)   请使用Stream流找出集合中价格最贵的订流单，把这个订单的详细信息打印出来。
 * 4)   请使用Stream流遍历集合中的每个订单，要求按照价格降序输出每个订单的详情。
 */
public class Demo01 {


    public static void main(String[] args) throws Exception {
        //1、创建ArrayList集合, 用于存储订单Order对象
        List<Order> orders = new ArrayList<>();

        //2、创建一个SAXReader解析器
        SAXReader saxReader = new SAXReader();

        //3、调用read()方法把XML文件读成Document对象
        //这时候这个document对象就代表整个XML文件
        Document document = saxReader.read("javapromax\\day16_exam\\src\\orders.xml");

        //4、调用Element getElement() 方法获取根元素对象
        //这是rootElement -->就代表根元素标签,以及里面的所有元素
        Element rootElement = document.getRootElement();

        //5、获取所有指定名称的子标签
        List<Element> everOrder = rootElement.elements("order");

        //9、创建一个日期格式化对象
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        //6、遍历获取到的所有子元素对象
        for (Element element : everOrder) {
            //7、创建Order对象用于封装订单的对应数据
            Order order = new Order();
            //8、获取对应的值存到对象中去
            order.setId(Integer.parseInt(element.attributeValue("id")));
            order.setName(element.element("name").getTextTrim());
            order.setLocalDateTime(LocalDateTime.parse(element.elementTextTrim("time"), dtf));
            order.setPrice(Double.parseDouble(element.elementTextTrim("double")));
            //10、然后将封装好的对象存到集合中去
            orders.add(order);
        }
        //12、直接打印集合
        System.out.println(orders);

        //11、展示集合中所有的数据
        orders.forEach(o -> System.out.println(o));
        System.out.println("-----------------------------------------------------");
        //14.首先指定一个时间对象
        LocalDateTime now = LocalDateTime.of(2023, 5, 21, 0, 0, 0, 0);

       /* int second = now.getSecond();
        System.out.println(second);*/

        //13、用Stream找出今天之前的订单,并遍历输出 使用判断两个对象在前还是在后 isBefore isAfter
        orders.stream().filter(o -> o.getLocalDateTime().isBefore(now)).forEach(o -> System.out.println(o.getLocalDateTime()));
        System.out.println("-------------------------------------------------------");
        //14、使用Stream流找出集合中最贵的订单, 把这个订单的详细信息打印出来
        Order order = orders.stream().max((o1, o2) -> Double.compare(o1.getPrice(), o2.getPrice())).get();//其实就是取最后一位
        System.out.println(order);
        System.out.println("--------------------------------------------");
        //15、请使用Stream流遍历集合中的每个订单，要求按照价格降序输出每个订单的详情。
        orders.stream().sorted((o1, o2) -> Double.compare(o2.getPrice(),o1.getPrice())).forEach(System.out::println);

    }
}
